νμ₯ κ°λ₯νκ³ ν¨μ¨μ μΈ μ ν리μΌμ΄μ ꡬμΆμ μν 컨ν μ€νΈ νμ© ν¨ν΄κ³Ό κ³ κΈ μ±λ₯ μ΅μ ν κΈ°λ²μ λ€λ£¨λ Reactμ useContext ν μ λν ν¬κ΄μ μΈ κ°μ΄λμ λλ€.
React useContext: 컨ν μ€νΈ νμ© λ° μ±λ₯ μ΅μ ν λ§μ€ν°νκΈ°
Reactμ Context APIλ μ»΄ν¬λνΈ νΈλ¦¬μ λͺ¨λ λ 벨μ ν΅ν΄ λͺ
μμ μΌλ‘ propsλ₯Ό μ λ¬νμ§ μκ³ λ μ»΄ν¬λνΈ κ°μ λ°μ΄ν°λ₯Ό 곡μ ν μ μλ κ°λ ₯ν λ°©λ²μ μ 곡ν©λλ€. useContext ν
μ 컨ν
μ€νΈ κ°μ μλΉλ₯Ό λ¨μννμ¬ ν¨μν μ»΄ν¬λνΈ λ΄μμ 곡μ λ°μ΄ν°μ λ μ½κ² μ κ·Όνκ³ νμ©ν μ μκ² ν΄μ€λλ€. κ·Έλ¬λ useContextλ₯Ό λΆμ μ νκ² μ¬μ©νλ©΄ νΉν ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ
μμ μ±λ₯ λ³λͺ© νμμ μ΄λν μ μμ΅λλ€. μ΄ κ°μ΄λμμλ 컨ν
μ€νΈ νμ©μ μν λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ³ , ν¨μ¨μ μ΄κ³ νμ₯ κ°λ₯ν React μ ν리μΌμ΄μ
μ 보μ₯νκΈ° μν κ³ κΈ μ΅μ ν κΈ°λ²μ μ 곡ν©λλ€.
React Context API μ΄ν΄νκΈ°
useContextμ λν΄ μμΈν μμ보기 μ μ Context APIμ ν΅μ¬ κ°λ
μ κ°λ΅ν μ΄ν΄λ³΄κ² μ΅λλ€. Context APIλ μΈ κ°μ§ μ£Όμ λΆλΆμΌλ‘ ꡬμ±λ©λλ€:
- Context: 곡μ λ°μ΄ν°λ₯Ό λ΄λ 컨ν
μ΄λμ
λλ€.
React.createContext()λ₯Ό μ¬μ©νμ¬ μ»¨ν μ€νΈλ₯Ό μμ±ν©λλ€. - Provider: μμ μ»΄ν¬λνΈμκ² μ»¨ν μ€νΈ κ°μ μ 곡νλ μ»΄ν¬λνΈμ λλ€. Providerλ‘ κ°μΈμ§ λͺ¨λ μ»΄ν¬λνΈλ 컨ν μ€νΈ κ°μ μ κ·Όν μ μμ΅λλ€.
- Consumer: 컨ν
μ€νΈ κ°μ ꡬλ
νκ³ μ»¨ν
μ€νΈ κ°μ΄ λ³κ²½λ λλ§λ€ 리λ λλ§λλ μ»΄ν¬λνΈμ
λλ€.
useContextν μ ν¨μν μ»΄ν¬λνΈμμ 컨ν μ€νΈλ₯Ό μλΉνλ νλμ μΈ λ°©μμ λλ€.
useContext ν μκ°
useContext ν
μ ν¨μν μ»΄ν¬λνΈκ° 컨ν
μ€νΈλ₯Ό ꡬλ
ν μ μκ² ν΄μ£Όλ React ν
μ
λλ€. μ΄ ν
μ 컨ν
μ€νΈ κ°μ²΄(React.createContext()κ° λ°νν κ°)λ₯Ό μΈμλ‘ λ°κ³ ν΄λΉ 컨ν
μ€νΈμ νμ¬ κ°μ λ°νν©λλ€. 컨ν
μ€νΈ κ°μ΄ λ³κ²½λλ©΄ μ»΄ν¬λνΈλ 리λ λλ§λ©λλ€.
κΈ°λ³Έμ μΈ μμλ λ€μκ³Ό κ°μ΅λλ€:
κΈ°λ³Έ μμ
ν λ§ μ»¨ν μ€νΈκ° μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€:
import React, { createContext, useContext, useState } from 'react';
const ThemeContext = createContext('light');
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');
};
const value = {
theme,
toggleTheme,
};
return (
{children}
);
}
function ThemedComponent() {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
Current Theme: {theme}
);
}
function App() {
return (
);
}
export default App;
μ΄ μμ μμλ:
ThemeContextλReact.createContext('light')λ₯Ό μ¬μ©νμ¬ μμ±λ©λλ€. κΈ°λ³Έκ°μ 'light'μ λλ€.ThemeProviderλ ν λ§ κ°κ³ΌtoggleThemeν¨μλ₯Ό μμ μ»΄ν¬λνΈμ μ 곡ν©λλ€.ThemedComponentλuseContext(ThemeContext)λ₯Ό μ¬μ©νμ¬ νμ¬ ν λ§μtoggleThemeν¨μμ μ κ·Όν©λλ€.
μΌλ°μ μΈ ν¨μ κ³Ό μ±λ₯ λ¬Έμ
useContextλ 컨ν
μ€νΈ μλΉλ₯Ό λ¨μννμ§λ§, μ μ€νκ² μ¬μ©νμ§ μμΌλ©΄ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν¬ μλ μμ΅λλ€. μΌλ°μ μΈ ν¨μ μ λ€μκ³Ό κ°μ΅λλ€:
- λΆνμν 리λ λλ§:
useContextλ₯Ό μ¬μ©νλ λͺ¨λ μ»΄ν¬λνΈλ 컨ν μ€νΈ κ°μ΄ λ³κ²½λ λλ§λ€ 리λ λλ§λ©λλ€. μ΄λ μ»΄ν¬λνΈκ° μ€μ λ‘ λ³κ²½λ 컨ν μ€νΈ κ°μ νΉμ λΆλΆμ μ¬μ©νμ§ μλλΌλ λ§μ°¬κ°μ§μ λλ€. μ΄λ νΉν μμ£Ό μ λ°μ΄νΈλλ 컨ν μ€νΈ κ°μ κ°μ§ λκ·λͺ¨ μ ν리μΌμ΄μ μμ λΆνμν 리λ λλ§κ³Ό μ±λ₯ λ³λͺ© νμμ μ΄λν μ μμ΅λλ€. - ν° μ»¨ν μ€νΈ κ°: 컨ν μ€νΈ κ°μ΄ ν° κ°μ²΄μΈ κ²½μ°, ν΄λΉ κ°μ²΄ λ΄μ μ΄λ€ μμ±μ΄λ λ³κ²½λλ©΄ λͺ¨λ μλΉμ μ»΄ν¬λνΈμ 리λ λλ§μ μ λ°ν©λλ€.
- μ¦μ μ λ°μ΄νΈ: 컨ν μ€νΈ κ°μ΄ μμ£Ό μ λ°μ΄νΈλλ©΄ μ»΄ν¬λνΈ νΈλ¦¬ μ 체μ κ±Έμ³ μ°μμ μΈ λ¦¬λ λλ§μ΄ λ°μνμ¬ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€.
μ±λ₯ μ΅μ ν κΈ°λ²
μ΄λ¬ν μ±λ₯ λ¬Έμ λ₯Ό μννλ €λ©΄ λ€μ μ΅μ ν κΈ°λ²μ κ³ λ €νμμμ€:
1. 컨ν μ€νΈ λΆλ¦¬
λͺ¨λ κ΄λ ¨ λ°μ΄ν°λ₯Ό λ¨μΌ 컨ν μ€νΈμ λ£λ λμ , 컨ν μ€νΈλ₯Ό λ μκ³ μΈλΆνλ 컨ν μ€νΈλ‘ λΆλ¦¬νμμμ€. μ΄λ κ² νλ©΄ λ°μ΄ν°μ νΉμ λΆλΆμ΄ λ³κ²½λ λ 리λ λλ§λλ μ»΄ν¬λνΈμ μλ₯Ό μ€μΌ μ μμ΅λλ€.
μμ :
μ¬μ©μ νλ‘ν μ 보μ μ¬μ©μ μ€μ μ λͺ¨λ ν¬ν¨νλ λ¨μΌ UserContext λμ , κ°κ°μ λν΄ λ³λμ 컨ν
μ€νΈλ₯Ό μμ±ν©λλ€:
import React, { createContext, useContext, useState } from 'react';
const UserProfileContext = createContext(null);
const UserSettingsContext = createContext(null);
function UserProfileProvider({ children }) {
const [profile, setProfile] = useState({
name: 'John Doe',
email: 'john.doe@example.com',
});
const updateProfile = (newProfile) => {
setProfile(newProfile);
};
const value = {
profile,
updateProfile,
};
return (
{children}
);
}
function UserSettingsProvider({ children }) {
const [settings, setSettings] = useState({
notificationsEnabled: true,
theme: 'light',
});
const updateSettings = (newSettings) => {
setSettings(newSettings);
};
const value = {
settings,
updateSettings,
};
return (
{children}
);
}
function ProfileComponent() {
const { profile } = useContext(UserProfileContext);
return (
Name: {profile?.name}
Email: {profile?.email}
);
}
function SettingsComponent() {
const { settings } = useContext(UserSettingsContext);
return (
Notifications: {settings?.notificationsEnabled ? 'Enabled' : 'Disabled'}
Theme: {settings?.theme}
);
}
function App() {
return (
);
}
export default App;
μ΄μ μ¬μ©μ νλ‘ν λ³κ²½μ UserProfileContextλ₯Ό μλΉνλ μ»΄ν¬λνΈλ§ 리λ λλ§νκ³ , μ¬μ©μ μ€μ λ³κ²½μ UserSettingsContextλ₯Ό μλΉνλ μ»΄ν¬λνΈλ§ 리λ λλ§ν©λλ€.
2. React.memoλ₯Ό μ¬μ©ν λ©λͺ¨μ΄μ μ΄μ
컨ν
μ€νΈλ₯Ό μλΉνλ μ»΄ν¬λνΈλ₯Ό React.memoλ‘ κ°μΈμμμ€. React.memoλ ν¨μν μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ¦νλ κ³ μ°¨ μ»΄ν¬λνΈ(HOC)μ
λλ€. μ»΄ν¬λνΈμ propsκ° λ³κ²½λμ§ μμλ€λ©΄ 리λ λλ§μ λ°©μ§ν©λλ€. μ΄λ₯Ό 컨ν
μ€νΈ λΆλ¦¬μ κ²°ν©νλ©΄ λΆνμν 리λ λλ§μ ν¬κ² μ€μΌ μ μμ΅λλ€.
μμ :
import React, { useContext } from 'react';
const MyContext = React.createContext(null);
const MyComponent = React.memo(function MyComponent() {
const { value } = useContext(MyContext);
console.log('MyComponent rendered');
return (
Value: {value}
);
});
export default MyComponent;
μ΄ μμ μμ MyComponentλ MyContextμ valueκ° λ³κ²½λ λλ§ λ¦¬λ λλ§λ©λλ€.
3. useMemoμ useCallback
useMemoμ useCallbackμ μ¬μ©νμ¬ μ»¨ν
μ€νΈ κ°μΌλ‘ μ λ¬λλ κ°κ³Ό ν¨μλ₯Ό λ©λͺ¨μ΄μ¦νμμμ€. μ΄λ κ² νλ©΄ κΈ°λ³Έ μ’
μμ±μ΄ λ³κ²½λ λλ§ μ»¨ν
μ€νΈ κ°μ΄ λ³κ²½λλλ‘ λ³΄μ₯νμ¬ μλΉμ μ»΄ν¬λνΈμ λΆνμν 리λ λλ§μ λ°©μ§ν μ μμ΅λλ€.
μμ :
import React, { createContext, useState, useMemo, useCallback, useContext } from 'react';
const MyContext = createContext(null);
function MyProvider({ children }) {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []);
const contextValue = useMemo(() => ({
count,
increment,
}), [count, increment]);
return (
{children}
);
}
function MyComponent() {
const { count, increment } = useContext(MyContext);
console.log('MyComponent rendered');
return (
Count: {count}
);
}
function App() {
return (
);
}
export default App;
μ΄ μμ μμλ:
useCallbackμincrementν¨μλ₯Ό λ©λͺ¨μ΄μ¦νμ¬ μ’ μμ±μ΄ λ³κ²½λ λλ§ λ³κ²½λλλ‘ λ³΄μ₯ν©λλ€(μ΄ κ²½μ° μ’ μμ±μ΄ μμΌλ―λ‘ λ¬΄κΈ°ν λ©λͺ¨μ΄μ¦λ©λλ€).useMemoλ 컨ν μ€νΈ κ°μ λ©λͺ¨μ΄μ¦νμ¬countλλincrementν¨μκ° λ³κ²½λ λλ§ λ³κ²½λλλ‘ λ³΄μ₯ν©λλ€.
4. μ λ ν°(Selector)
μ λ ν°λ₯Ό ꡬννμ¬ μλΉμ μ»΄ν¬λνΈ λ΄μμ 컨ν μ€νΈ κ°μΌλ‘λΆν° νμν λ°μ΄ν°λ§ μΆμΆνμμμ€. μ΄λ μ»΄ν¬λνΈκ° μμ‘΄νλ νΉμ λ°μ΄ν°κ° λ³κ²½λ λλ§ λ¦¬λ λλ§λλλ‘ λ³΄μ₯νμ¬ λΆνμν 리λ λλ§ κ°λ₯μ±μ μ€μ λλ€.
μμ :
import React, { createContext, useContext } from 'react';
const MyContext = createContext(null);
const selectCount = (contextValue) => contextValue.count;
function MyComponent() {
const contextValue = useContext(MyContext);
const count = selectCount(contextValue);
console.log('MyComponent rendered');
return (
Count: {count}
);
}
export default MyComponent;
μ΄ μμ λ λ¨μνλμμ§λ§, μ€μ μλ리μ€μμλ νΉν ν° μ»¨ν μ€νΈ κ°μ λ€λ£° λ μ λ ν°κ° λ 볡μ‘νκ³ μ±λ₯μ΄ μ’μ μ μμ΅λλ€.
5. λΆλ³ λ°μ΄ν° ꡬ쑰
λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νλ©΄ 컨ν μ€νΈ κ°μ λ³κ²½μ΄ κΈ°μ‘΄ κ°μ²΄λ₯Ό μμ νλ λμ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλλ‘ λ³΄μ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ Reactκ° λ³κ²½ μ¬νμ λ μ½κ² κ°μ§νκ³ λ¦¬λ λλ§μ μ΅μ νν μ μμ΅λλ€. Immutable.jsμ κ°μ λΌμ΄λΈλ¬λ¦¬λ λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό κ΄λ¦¬νλ λ° λμμ΄ λ μ μμ΅λλ€.
μμ :
import React, { createContext, useState, useMemo, useContext } from 'react';
import { Map } from 'immutable';
const MyContext = createContext(Map());
function MyProvider({ children }) {
const [data, setData] = useState(Map({
count: 0,
name: 'Initial Name',
}));
const increment = () => {
setData(prevData => prevData.set('count', prevData.get('count') + 1));
};
const updateName = (newName) => {
setData(prevData => prevData.set('name', newName));
};
const contextValue = useMemo(() => ({
data,
increment,
updateName,
}), [data]);
return (
{children}
);
}
function MyComponent() {
const contextValue = useContext(MyContext);
const count = contextValue.get('count');
console.log('MyComponent rendered');
return (
Count: {count}
);
}
function App() {
return (
);
}
export default App;
μ΄ μμ λ Immutable.jsλ₯Ό νμ©νμ¬ μ»¨ν μ€νΈ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ©°, κ° μ λ°μ΄νΈκ° μλ‘μ΄ λΆλ³ Mapμ μμ±νλλ‘ λ³΄μ₯νμ¬ Reactκ° λ¦¬λ λλ§μ λ ν¨κ³Όμ μΌλ‘ μ΅μ ννλ λ° λμμ μ€λλ€.
μ€μ μμ λ° μ¬μ© μ¬λ‘
Context APIμ useContextλ λ€μν μ€μ μλ리μ€μμ λ리 μ¬μ©λ©λλ€:
- ν λ§ κ΄λ¦¬: μ΄μ μμ μμ 보μ¬μ€ κ²μ²λΌ μ ν리μΌμ΄μ μ 체μ ν λ§(λΌμ΄νΈ/λ€ν¬ λͺ¨λ)λ₯Ό κ΄λ¦¬ν©λλ€.
- μΈμ¦: μ¬μ©μ μΈμ¦ μνμ μ¬μ©μ λ°μ΄ν°λ₯Ό νμν μ»΄ν¬λνΈμ μ 곡ν©λλ€. μλ₯Ό λ€μ΄, μ μ μΈμ¦ 컨ν μ€νΈλ μ¬μ©μ λ‘κ·ΈμΈ, λ‘κ·Έμμ, μ¬μ©μ νλ‘ν λ°μ΄ν°λ₯Ό κ΄λ¦¬νμ¬ prop λλ¦΄λ§ μμ΄ μ ν리μΌμ΄μ μ 체μμ μ κ·Όν μ μλλ‘ ν©λλ€.
- μΈμ΄/λ‘μΊ μ€μ : κ΅μ ν(i18n) λ° νμ§ν(l10n)λ₯Ό μν΄ μ ν리μΌμ΄μ μ 체μμ νμ¬ μΈμ΄ λλ λ‘μΊ μ€μ μ 곡μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈλ μ¬μ©μκ° μ νΈνλ μΈμ΄λ‘ μ½ν μΈ λ₯Ό νμν μ μμ΅λλ€.
- μ μ μ€μ : API μλν¬μΈνΈλ κΈ°λ₯ νλκ·Έμ κ°μ μ μ μ€μ κ°μ 곡μ ν©λλ€. μ΄λ μ€μ κ°μ λ°λΌ μ ν리μΌμ΄μ λμμ λμ μΌλ‘ μ‘°μ νλ λ° μ¬μ©λ μ μμ΅λλ€.
- μ₯λ°κ΅¬λ: μ΄μ»€λ¨Έμ€ μ ν리μΌμ΄μ μ λ°μ κ±Έμ³ μ₯λ°κ΅¬λ μνλ₯Ό κ΄λ¦¬νκ³ μ₯λ°κ΅¬λ νλͺ© λ° μμ μ λν μ κ·Όμ μ 곡ν©λλ€.
μμ : κ΅μ ν(i18n)
κ΅μ νλ₯Ό μν΄ Context APIλ₯Ό μ¬μ©νλ κ°λ¨ν μλ₯Ό λ€μ΄λ³΄κ² μ΅λλ€:
import React, { createContext, useState, useContext, useMemo } from 'react';
const LanguageContext = createContext({
locale: 'en',
messages: {},
});
const translations = {
en: {
greeting: 'Hello',
description: 'Welcome to our website!',
},
fr: {
greeting: 'Bonjour',
description: 'Bienvenue sur notre site web !',
},
es: {
greeting: 'Hola',
description: 'Β‘Bienvenido a nuestro sitio web!',
},
};
function LanguageProvider({ children }) {
const [locale, setLocale] = useState('en');
const setLanguage = (newLocale) => {
setLocale(newLocale);
};
const messages = useMemo(() => translations[locale] || translations['en'], [locale]);
const contextValue = useMemo(() => ({
locale,
messages,
setLanguage,
}), [locale, messages]);
return (
{children}
);
}
function Greeting() {
const { messages } = useContext(LanguageContext);
return (
{messages.greeting}
);
}
function Description() {
const { messages } = useContext(LanguageContext);
return (
{messages.description}
);
}
function LanguageSwitcher() {
const { setLanguage } = useContext(LanguageContext);
return (
);
}
function App() {
return (
);
}
export default App;
μ΄ μμ μμλ:
LanguageContextλ νμ¬ λ‘μΊκ³Ό λ©μμ§λ₯Ό μ 곡ν©λλ€.LanguageProviderλ λ‘μΊ μνλ₯Ό κ΄λ¦¬νκ³ μ»¨ν μ€νΈ κ°μ μ 곡ν©λλ€.Greetingκ³ΌDescriptionμ»΄ν¬λνΈλ 컨ν μ€νΈλ₯Ό μ¬μ©νμ¬ λ²μλ ν μ€νΈλ₯Ό νμν©λλ€.LanguageSwitcherμ»΄ν¬λνΈλ μ¬μ©μκ° μΈμ΄λ₯Ό λ³κ²½ν μ μλλ‘ ν©λλ€.
useContextμ λμ
useContextλ κ°λ ₯ν λꡬμ΄μ§λ§ λͺ¨λ μν κ΄λ¦¬ μλ리μ€μ μ΅μμ μ루μ
μ μλλλ€. κ³ λ €ν΄ λ³Ό λ§ν λͺ κ°μ§ λμμ λ€μκ³Ό κ°μ΅λλ€:
- Redux: JavaScript μ±μ μν μμΈ‘ κ°λ₯ν μν 컨ν μ΄λμ λλ€. Reduxλ νΉν λκ·λͺ¨ μ ν리μΌμ΄μ μμ 볡μ‘ν μ ν리μΌμ΄μ μνλ₯Ό κ΄λ¦¬νκΈ° μν μΈκΈ° μλ μ νμ λλ€.
- MobX: κ°λ¨νκ³ νμ₯ κ°λ₯ν μν κ΄λ¦¬ μ루μ μ λλ€. MobXλ κ΄μ°° κ°λ₯ν λ°μ΄ν°μ μλ λ°μμ±μ μ¬μ©νμ¬ μνλ₯Ό κ΄λ¦¬ν©λλ€.
- Recoil: Reactλ₯Ό μν μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ‘, atomκ³Ό selectorλ₯Ό μ¬μ©νμ¬ μνλ₯Ό κ΄λ¦¬ν©λλ€. Recoilμ Reduxλ MobXλ³΄λ€ λ μΈλΆνλκ³ ν¨μ¨μ μΌλ‘ μ€κ³λμμ΅λλ€.
- Zustand: λ¨μνλ flux μμΉμ μ¬μ©νλ μκ³ λΉ λ₯΄λ©° νμ₯ κ°λ₯ν λ² μ΄λ³Έ μν κ΄λ¦¬ μ루μ μ λλ€.
- Jotai: μμμ λͺ¨λΈμ μ¬μ©νλ Reactλ₯Ό μν μμμ μ΄κ³ μ μ°ν μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬μ λλ€.
- Prop λ릴λ§: μ»΄ν¬λνΈ νΈλ¦¬κ° μμ κ°λ¨ν κ²½μ°, prop λ릴λ§μ΄ μ€ν κ°λ₯ν μ΅μ μΌ μ μμ΅λλ€. μ΄λ μ»΄ν¬λνΈ νΈλ¦¬μ μ¬λ¬ λ 벨μ ν΅ν΄ propsλ₯Ό μ λ¬νλ κ²μ ν¬ν¨ν©λλ€.
μν κ΄λ¦¬ μ루μ μ μ νμ μ ν리μΌμ΄μ μ νΉμ μꡬ μ¬νμ λ°λΌ λ€λ¦ λλ€. κ²°μ μ λ΄λ¦΄ λ μ ν리μΌμ΄μ μ 볡μ‘μ±, νμ κ·λͺ¨, μ±λ₯ μꡬ μ¬νμ κ³ λ €νμμμ€.
κ²°λ‘
Reactμ useContext ν
μ μ»΄ν¬λνΈ κ°μ λ°μ΄ν°λ₯Ό 곡μ νλ νΈλ¦¬νκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€. μ μ¬μ μΈ μ±λ₯ ν¨μ μ μ΄ν΄νκ³ μ΄ κ°μ΄λμμ μ€λͺ
ν μ΅μ ν κΈ°λ²μ μ μ©ν¨μΌλ‘μ¨, useContextμ νμ νμ©νμ¬ νμ₯ κ°λ₯νκ³ μ±λ₯μ΄ λ°μ΄λ React μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€. μ μ ν λ 컨ν
μ€νΈλ₯Ό λΆλ¦¬νκ³ , React.memoλ‘ μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ¦νκ³ , 컨ν
μ€νΈ κ°μ useMemoμ useCallbackμ νμ©νκ³ , μ
λ ν°λ₯Ό ꡬννκ³ , λΆλ³ λ°μ΄ν° ꡬ쑰 μ¬μ©μ κ³ λ €νμ¬ λΆνμν 리λ λλ§μ μ΅μννκ³ μ ν리μΌμ΄μ
μ±λ₯μ μ΅μ ννλ κ²μ κΈ°μ΅νμμμ€.
νμ μ ν리μΌμ΄μ
μ μ±λ₯μ νλ‘νμΌλ§νμ¬ μ»¨ν
μ€νΈ μλΉμ κ΄λ ¨λ λ³λͺ© νμμ μλ³νκ³ ν΄κ²°νμμμ€. μ΄λ¬ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ useContext μ¬μ©μ΄ μννκ³ ν¨μ¨μ μΈ μ¬μ©μ κ²½νμ κΈ°μ¬ν μ μλλ‘ λ³΄μ₯ν μ μμ΅λλ€.